在這個系列的文章中,我們將主要討論各種服務(Service)。因此,在開始之前,讓我們先了解服務的本質是什麼。
在類 Unix 系統中,我們經常聽到 daemon 這個詞,它指的是在背景持續運行的程式。這些程式的名稱通常以字母 d
作為結尾,例如網頁伺服器的 httpd
或管理 cron 作業的 crond
。您可以使用 htop
指令查看具有 d
結尾的程式,通常它們就是 daemon。
事實上,Service 本質上就是一種 daemon,因為它們必須持續運行(例如,網頁伺服器必須持續監聽 80 port,隨時處理傳入的 HTTP 請求)。
在 Debian 系統裡面,我們可以使用 systemctl
指令來管理 service,以網頁伺服器 nginx 為例:
打開 service
$ systemctl start nginx
關閉 service
$ systemctl stop nginx
看 service 的狀態
$ systemctl status nginx
重啟 service
$ systemctl restart nginx
啟用及停用 service,啟用的話該 service 會在開機時自動開啟
$ systemctl enable nginx
$ systemctl disable nginx
我們的服務將由 systemd
管理,因此必須符合其格式。設定檔具有許多可設定的選項,以下是一個簡單的範例:
[Unit]
Description=Test Server
Documentation=https://example.com
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/start.sh
PIDFile=/var/run/test-server.pid
ExecStop=/usr/bin/stop.sh
[Install]
WantedBy=multi-user.target
Description
Documentation
After
Before
選項Type
Simple
type 的 service 是最簡單的,沒有特殊需求可以使用此類型ExecStart
/ ExecStop
systemctl start nginx
的時候要執行哪些程式start.sh
裡面會放啟動服務所需的程式碼,例如說這是一個 Flask 專案,那可能就是 flask run
之類的PIDFile
WantedBy
multi-user.target
即可最後我們來看一個現有的 service:
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target
[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
這是 sshd
的 service 設定檔,這裡有幾個上面沒有提到的東西,去看文件基本上也可以知道他們的功能,例如
Type=notify
simple
類似,但他會在 service 啟動完成之後通知 systemd
KillMode=process
systemctl restart sshd
的時候現有的 ssh 連線不會斷的原因參考資料